home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
diskutil
/
twister2.lzh
/
TWISTER.C
< prev
next >
Wrap
C/C++ Source or Header
|
1985-11-20
|
8KB
|
252 lines
/********************************************************************
* *
* The Twister *
* by *
* David Small *
* and *
* Dan Moore *
* *
* *
* version 2 *
* *
* Copyright (c) 1986 David Small and Daniel Moore for STart Mag. *
* *
********************************************************************
* *
* Dedication: *
* To Bill and all the other twisted cats in the world *
* *
********************************************************************/
#include <portab.h>
#include <gemdefs.h>
#include <osbind.h>
#include <obdefs.h>
#include "twister.h"
#include "twster.rsh"
/* something that should be in the compiler but isn't */
#define void /* */
/* misc. defines */
#define DESK 0
#define WF_WXYWH 4
/* Stuff to call AES. */
WORD contrl[12];
WORD intin[80];
WORD ptsin[256];
WORD intout[45];
WORD ptsout[12];
WORD msgbuf[8];
WORD VDIhandle;
/* external variables (defined in system library) */
extern WORD gl_apid;
/*
* hooks into the twister formatter code.
* These are passed as globals to avoid problems with
* passing params via Supexec().
*
* The actual twister format code is in mmtwst.c. This file
* is common to both backup.prg and twister.prg. It is
* located in the twister directory on the disk.
*/
extern twister(); /* the formatter, obviously */
extern int thedisk, /* drive number to format (A=0, B=1) */
dblsided, /* sides (0 = single, -1 = double) */
sectoroffset; /* offset for physical sector numbering */
extern long buffer; /* Track buffer for format. */
extern int badflag; /* non-zero means a verify error */
/* misc support routines */
void
setmem(p, n, c)
register unsigned char *p;
register unsigned int n;
register unsigned char c;
{
for (; n; n--)
*(p++) = c;
}
void
put_word(addr, val)
register unsigned char *addr;
register unsigned int val;
/*
* Store val at the word at addr. The data will be stored in low-high
* order, so it will be stored one byte at a time.
*/
{
*(addr++) = val & 0xff;
*addr = (val >> 8) & 0xff;
}
/* now the GEM supprot stuff */
void
init_gem()
/*
* setup the "resource" and the pointers to it. Doing it here saves us from
* having a .rsc file on the disk which the user can forget to copy.
*/
{
register int i, j;
WORD work_in[11], work_out[57];
WORD x, y, w, h;
appl_init(); /* be trusting, assume it won't fail. (haha) */
for (i = 0; i < 10; i++)
work_in[i] = 1;
work_in[10] = 2;
/* don't want the char and box sizes */
VDIhandle = graf_handle(&x, &y, &w, &h);
v_opnvwk(work_in, &VDIhandle, work_out); /* open virtual work stn */
/* clear the screen, and then force a redraw of the dither */
v_clrwk(VDIhandle);
wind_get(DESK, WF_WXYWH, &x, &y, &w, &h);
form_dial(FMD_FINISH, 0L, 0L, x, y, w, h);
/*
* Now adjust the object coordinates from character based to pixel
* based. Also hook the strings to the string objects and buttons.
*/
for (i = j = 0; j < NUM_OBS; j++) {
rsrc_obfix(rs_object, j); /* fix the coordinates system */
if (rs_object[j].type == G_STRING || rs_object[j].type == G_BUTTON)
rs_object[j].spec = rs_strings[i++];
}
}
void
cleartrack(num)
int num;
{
/*
* clear a track. Use buffer as a scratch area.
*/
setmem(buffer, (512 * 10), 0);
Flopwr(buffer, 0L, thedisk, 1, num, 0, 10); /* write 10 sectors */
if (dblsided)
Flopwr(buffer, 0L, thedisk, 1, num, 1, 10); /* 10 more on the back */
}
extern exit();
asm {
exit: dc.w 0 /* just a place holder to fool the linker */
}
void
main()
{
WORD x, y, w, h, which;
/*
* tell GEM hello.
* we're glad to see him too.
*/
init_gem();
/*
* Next allocate the track buffer.
* Give it 16K. We "should" only need a little less than
* 8K, but it never hurts to have to much.
*/
buffer = Malloc(0x4000L);
sectoroffset = 0; /* number sectors 1 to 10 not 11 to 20 */
/* set the default buttons */
rs_object[LONELY].state |= SELECTED;
rs_object[DRIVE0].state |= SELECTED;
/* put up the dialog */
form_center(rs_object, &x, &y, &w, &h);
form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h);
objc_draw(rs_object, ROOT, 9, x-1, y-1, w+2, h+2);
for(;;) {
graf_mouse(0, 0L); /* arrow */
/*
* As you may gather, this isn't the normal form_do.
* If you are using the normal one (highly likely
* since you don't have mine) just remove the
* ", 0L, 0L" from the call.
*/
which = form_do(rs_object, 0, 0L, 0L);
if (which == RUNAWAY)
break; /* they don't want us. boo hoo */
graf_mouse(2, 0L); /* busy bee */
/*
* setup the input parameters for the format.
*/
if (rs_object[DRIVE0].state & SELECTED)
thedisk = 0; /* format drive A */
else
thedisk = 1; /* otherwise drive B */
if (rs_object[MARRIED].state & SELECTED)
dblsided = -1; /* double sided */
else
dblsided = 0; /* single sided */
Supexec(twister); /* run the formatter in super mode */
if (!badflag) { /* good disk? */
/*
* Yes, now set it up as a GEMDOS disk.
*
* First clear the fat and directory sectors.
* Simpliest is to just clear the first few tracks
*/
cleartrack(0);
cleartrack(1);
/* now prototype the boot sector */
/* this is where version 1.0 had a bug, it wrote the
* same serial number on all disks
*/
Protobt(buffer, 0x02000000L, (dblsided ? 3 : 2), 0);
/* now change the sectors per track entry. (10 not 9) */
put_word(buffer + 0x18, 10);
/* next is the sectors on media entry. */
put_word(buffer + 0x13, (dblsided ? 1600 : 800));
/* and finally write the boot sector */
Flopwr(buffer, 0L, thedisk, 1, 0, 0, 1);
}
else {
graf_mouse(0, 0L); /* arrow */
form_alert(1, "[3][There was error formatting|the disk.][Abort]");
}
/* deslect the format button */
rs_object[TWISTIT].state &= ~SELECTED;
objc_draw(rs_object, TWISTIT, MAX_DEPTH, x, y, w, h);
}
Mfree(buffer); /* give it back to TOS */
/* tell GEM bye, bye */
form_dial(FMD_FINISH, 0L, 0L, x, y, w, h); /* force a redraw */
v_clsvwk(VDIhandle);
appl_exit();
_exit(0); /* wave bye, bye to the nice user */
}